作者:马岱五号_668 | 来源:互联网 | 2024-11-05 09:20
最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。
树莓派放在抽屉里吃灰有半年多了,去年玩了1个月后就没怎么开整了,上个月没工作,刚好有点闲暇,就把树莓派翻出来折腾,刚好碰到落网改版了,想起以前在树莓派论坛看到有网友拿树莓派来听豆瓣电台,代码那时我都下过,而且用树莓派试过,我喜欢上落网听歌,于是就想写一个
类似的python脚本....
首先 发现落网改版后 那些
mp3的信息就存在试听的html页面上的一个叫volPlaylist的js对象,比以前去相应的xml里找简单多了。
src="https://img.php1.cn/3c972/1e9f0/a6e/757efb87fb672053.jpeg">
正则拿到这个 json就可以播放了,不过这里没有mp3文件的播放时长,刚开始的时候不能自动播放下一曲,后来google了 一下 发现
mp3文件大小 码率 时长有对应的关系: >【码率】(kbps)=【文件大小】(字节)X8/【时间】(秒)/1000
无法获得码率但发现落网的mp3 都是 128kbps 根据header里得到的Content-Length 获得mp3大小 于是就可以获得
mp3的时长了。。。
首先是 安装 mpg123
下面是相应的python 代码 部分代码来自 在Pi上听豆瓣电台之Python(有更新)
#!/usr/bin/python
# coding: utf-8
# Filename: luoFm.py
import httplib
import json
import re
import sys
import subprocess
import urllib2
import time
from select import select
reload(sys)
sys.setdefaultencoding(‘utf-8‘)
class LuoFM_CLI:
def __init__(self, channel):
self.user = None
self.username = ‘‘
self.ch = channel
self.kbps = 128
def get_songlist(self):
httpConnection = httplib.HTTPConnection(‘www.luoo.net‘)
httpConnection.request(‘GET‘, ‘/music/‘ + self.ch)
luoHtml = httpConnection.getresponse().read()
playPattern = "volPlaylist\s*=\s*(\[\s*\{[\s\S]+?\}\s*\]);"
playUrl = re.compile(playPattern).findall(luoHtml)
self.songlist = json.loads(playUrl[0])
def control(self, r):
rlist, _, _ = select([sys.stdin], [], [], 1)
if rlist:
s = sys.stdin.readline()
if s[0] == ‘n‘:
return ‘next‘
elif s[0] == ‘p‘:
return ‘prev‘
def start(self):
self.get_songlist()
n = 0
while n < len(self.songlist):
r = self.songlist[n]
song_uri = r[‘mp3‘]
self.playmode = True
request = urllib2.Request(song_uri)
response = urllib2.urlopen(request)
headers = response.info()
#获取播放时长,这里选用128kbps 的码率 时长 = mp3的大小(kb) * 8 / 128
duratiOns= int(headers[‘Content-Length‘]) * 8 / 1000 / self.kbps
starttime = time.time()
print(u‘正在播放: ‘ + r[‘title‘] + u‘ 歌手: ‘ + r[‘artist‘])
self.player = subprocess.Popen([‘mpg123‘, ‘-v‘, song_uri], shell=False, universal_newlines=True, stdin=None,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while self.playmode:
c = self.control(r)
endtime = time.time()
usetime = endtime - starttime - durations
if c == ‘next‘ or usetime > 4:
self.player.kill()
n = n + 1
break
elif c == ‘prev‘:
self.player.kill()
n = n - 1
break
self.start
c = raw_input(‘请输入您想听的专辑数字:‘)
luoFm = LuoFM_CLI(c)
use_info = u‘‘‘
下一曲输入n
上一曲输入p
‘‘‘
print(use_info)
while 1:
luoFm.start()
执行$python luoFm.py
界面 专辑号要手动输入
参考文章
在Pi上听豆瓣电台之Python(有更新)
比特率
用树莓派来听落网电台,布布扣,bubuko.com